﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Common;
using System.Data;
using SisVendas.Entidades;
using SisVendas.Constants;
using MySql.Data.MySqlClient;

namespace SisVendas.DataAccess
{
    //Teste subversion
    public static class ClienteDAO
    {
        public static DataBaseHelper db = new DataBaseHelper();

        public static int Inserir(Cliente c)
        {
            string query = DatabaseConstants.SPName.InserirCliente;
            List<MySqlParameter> parametros = new List<MySqlParameter>();
            
            parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.Nome, c.Nome));
            parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.Bairro, c.Bairro));
            parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.Celular, c.Celular));

            parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.Telefone1, c.Telefone1));
            parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.Telefone2, c.Telefone2));

            parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.Cep, c.CEP));
            parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.Cidade, c.Cidade));
            parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.Email, c.Email));
            parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.Endereco, c.Endereco));
            parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.Estado, c.Estado));

            parametros.Add(db.BuildOutPutParameter(DatabaseConstants.Parametros.IdCliente, DbType.Int32, 32));

            db.ExecuteScalar(query, CommandType.StoredProcedure, parametros.ToArray());

            return int.Parse(parametros[parametros.Count - 1].Value.ToString());

        }

        public static void InserirObsevacao(Cliente c)
        {
            string query = DatabaseConstants.SPName.InserirObsCliente;
            List<MySqlParameter> parametros = new List<MySqlParameter>();

            if (c.Observacoes != null)
            {
                foreach (ObservacaoCliente oc in c.Observacoes)
                {
                    parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.IdUsuario, oc.Usuario.ID));
                    parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.IdCliente, c.ID));
                    parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.Observacao, oc.Observacao));
                    parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.DataObservacao, oc.DataObservacao));

                    db.ExecuteNonQuery(query, CommandType.StoredProcedure, parametros.ToArray());

                    parametros.Clear();
                }
                    
            }



        }

        public static void ExcluirObsCliente(Cliente c)
        {
            List<MySqlParameter> parametros = new List<MySqlParameter>();

            //Deve excluir todas as observações existentes do cliente
            if (c.Observacoes == null)
            {
                parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.IdCliente, c.ID));
                parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.IdObservacaoCliente, null));

                db.ExecuteNonQuery(DatabaseConstants.SPName.ExcluirObsCliente, parametros.ToArray());

            }
            else
            {
                //Exclui todas as observações existentes na lista de observações
                foreach (ObservacaoCliente oc in c.Observacoes)
                {
                    parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.IdCliente, c.ID));
                    parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.IdObservacaoCliente, oc.ID));

                    db.ExecuteNonQuery(DatabaseConstants.SPName.ExcluirObsCliente, parametros.ToArray());

                    parametros.Clear();
                }
            }

        }

        public static void Excluir(Cliente c)
        {
            List<MySqlParameter> parametros = new List<MySqlParameter>();
            parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.IdCliente, c.ID));

            db.ExecuteNonQuery(DatabaseConstants.SPName.ExcluirCliente, parametros.ToArray());
        }

        public static void Atualizar(Cliente c)
        {
            List<MySqlParameter> parametros = new List<MySqlParameter>();

            parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.Nome, c.Nome));
            parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.Bairro, c.Bairro));
            parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.Celular, c.Celular));
            parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.Cep, c.CEP));
            parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.Cidade, c.Cidade));
            parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.Email, c.Email));
            parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.Endereco, c.Endereco));
            parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.Estado, c.Estado));
            parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.IdCliente, c.ID));

            db.ExecuteNonQuery(DatabaseConstants.SPName.AtualizarCliente, CommandType.StoredProcedure, parametros.ToArray());

        }

        public static List<Cliente> Consultar(string consulta)
        {
            StringBuilder query = new StringBuilder();
            List<MySqlParameter> parametros = new List<MySqlParameter>();

             query.AppendLine("Select cl.idCliente,co.* ");
             query.AppendLine("from tbCliente cl inner join  ");
             query.AppendLine("tbContato co on co.idContato = cl.idContato ");
             query.AppendLine("where 1=1 ");

             if (!string.IsNullOrEmpty(consulta))
             {
                 query.AppendLine("and concat(coalesce(co.nome,''), ");
                 query.AppendLine("coalesce(co.telefone1,''),  ");
                 query.AppendLine("coalesce(co.telefone2,''), ");
                 query.AppendLine("coalesce(co.celular,''))like pConsulta ");

                 if (consulta.IndexOf('%') == -1)
                     consulta = "%" + consulta + "%";

                 parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.Consulta, consulta));

             }

             DataTable dt = db.ExecuteQueryWithResult(query.ToString(), parametros.ToArray());

            return (dt.Rows.Count >0 ?GetList(dt):null);
        }


        private static List<Cliente> GetList(DataTable dt)
        {
            List<Cliente> lstCliente = new List<Cliente>();

            foreach (DataRow r in dt.Rows)
            {
                Cliente c = new Cliente();
                c.ID = int.Parse(r[DatabaseConstants.Colunas.IdCliente].ToString());
                c.Bairro = r[DatabaseConstants.Colunas.Bairro].ToString();
                c.Celular = r[DatabaseConstants.Colunas.Celular].ToString();
                c.CEP = r[DatabaseConstants.Colunas.Cep].ToString();
                c.Cidade = r[DatabaseConstants.Colunas.Cidade].ToString();
                c.Email = r[DatabaseConstants.Colunas.Email].ToString();
                c.Endereco = r[DatabaseConstants.Colunas.Endereco].ToString();
                c.Estado = r[DatabaseConstants.Colunas.Estado].ToString();
                c.Nome = r[DatabaseConstants.Colunas.Nome].ToString();
                c.Telefone1 = r[DatabaseConstants.Colunas.Telefone1].ToString();
                c.Telefone2 = r[DatabaseConstants.Colunas.Telefone2].ToString();
                c.Observacoes = ConsultarObsCliente(c.ID);

                lstCliente.Add(c);
                
            }

            return lstCliente;
        }


        private static List<ObservacaoCliente> ConsultarObsCliente(int? idCliente)
        {
            string query = "Select * from tbObservacaoCliente where 1=1 ";
            List<MySqlParameter> parametros = new List<MySqlParameter>();

            if (idCliente != null)
                parametros.Add(new MySqlParameter(DatabaseConstants.Parametros.IdCliente, idCliente));
            else///todo: Colocar mensagem vinda das classes constantes
                throw new ArgumentException("Informe o id do cliente");

            DataTable dt = db.ExecuteQueryWithResult(query.ToString(), parametros.ToArray());


            return (dt.Rows.Count > 0 ? GetListObsCliente(dt) : null);
        }

        private static List<ObservacaoCliente> GetListObsCliente(DataTable dt)
        {
            List<ObservacaoCliente> lstObsCliente = new List<ObservacaoCliente>();

            foreach (DataRow r in dt.Rows)
            {
                ObservacaoCliente oc = new ObservacaoCliente();
                oc.DataObservacao = DateTime.Parse(r[DatabaseConstants.Colunas.DataObservacao].ToString());
                oc.ID = int.Parse(r[DatabaseConstants.Colunas.IdObservacao].ToString());
                oc.Observacao = r[DatabaseConstants.Colunas.Observacao].ToString();
                //Todo: implemntar busca de usuário por id
                //oc.Usuario = "teste";

                lstObsCliente.Add(oc);


            }

            return lstObsCliente;
        }

    }
}
